package jsen.tool.ddd.adapter.event;

/**
 * @author jsen
 * @date 2021/10/6
 */
public interface IEventBus {
    /**
     * 异步触发任务，执行在传入到eventbus的线程下
     *
     * @param event 事件
     * @param <E>   事件类型
     */
    <E extends DomainEvent> void fireEventAsync(E event, AsyncCallback<E> callback);

    /**
     * 异步触发任务，所有命中的consumer都并发执行
     *
     * @param event 事件
     * @param <E>   事件类型
     */
    <E extends DomainEvent> void fireEventParallel(E event, AsyncCallback<E> callback);

    /**
     * 同步触发任务，执行在任务当前线程下
     *
     * @param event 事件
     * @param <E>   事件类型
     */
    <E extends DomainEvent> void fireEvent(E event);

    /**
     * 注册consumer
     * <p>
     * 如果想要执行分布式消息，想要注册一个消费所有消息的消费者，然后把消息发送到mafka等
     * 为了轻量级实现，这里不对分布式有任何其他支持
     *
     * @param consumer consumer
     * @param <E>      事件类型
     */
    <E extends DomainEvent> void register(Consumer<E> consumer);
}
